// 试题表
import { defineStore } from 'pinia';

// 1. 定义试题对象的接口
interface sysTesPaper {
    id?: string | null; // 试题 ID (类型已修改为 string)
    name?: string; // 试题名称
    content?: string; // 试题内容
    objectiveScore?: number | null; // 客观得分比
    subjectiveScore?: number | null; // 主观得分比
    totalScore?: number | null; // 总分
    createTime?: string; // 创建时间
    teacherId?: number | null; // 教师 ID (类型保持为 number)
    teacherName?: string; // 教师名称
    subject?: string; // 科目
    timeLimit?: number; // 时间限制
    staterTime?: string; // 开始时间
    class?: string; // 目标班级
    state?: number; // 状态(1等待、2进行中、3完成)
}

// 2. 定义并导出 Pinia Store
export const useSysTesPaperStore = defineStore('sysTesPaper', {
    // 3. 定义 State
    state: () => ({
        sysTesPaper: [] as sysTesPaper[], // 初始化为空数组
    }),

    // 4. 定义 Getters
    getters: {
        /**
         * 根据传入的条件对象，筛选出所有匹配的试题
         */
        findPapersByConditions: (state) => {
            return (query: Partial<sysTesPaper>): sysTesPaper[] => {
                const activeConditions = Object.entries(query).filter(
                    ([_, value]) => value !== null && value !== undefined && value !== ''
                );

                if (activeConditions.length === 0) {
                    return [];
                }

                return state.sysTesPaper.filter(paper => {
                    return activeConditions.every(([key, value]) => {
                        return String(paper[key as keyof sysTesPaper])
                            .toLowerCase()
                            .includes(String(value).toLowerCase());
                    });
                });
            };
        },

        /**
         * 根据ID获取单个试题
         * @param state - Pinia 的 state 对象
         * @returns 一个函数，接收 id 并返回对应的试题对象或 undefined
         */
        getPaperById: (state) => {
            return (id: string): sysTesPaper | undefined => { // 参数类型已修改
                return state.sysTesPaper.find((paper) => paper.id === id);
            };
        },

        /**
         * 获取所有试题
         * @param state - Pinia 的 state 对象
         * @returns 所有试题的数组
         */
        allPapers: (state): sysTesPaper[] => {
            return state.sysTesPaper;
        },
    },

    // 5. 定义 Actions
    actions: {
        /**
         * 添加一个新的试题
         * @param paper - 要添加的试题对象 (不包含 id)
         */
        addPaper(paper: Omit<sysTesPaper, 'id'>) {
            // 生成一个唯一的字符串 ID
            const newId = `${Date.now().toString(36)}-${Math.random().toString(36).substr(2, 9)}`;
            const newPaper: sysTesPaper = {
                ...paper,
                id: newId,
            };
            this.sysTesPaper.push(newPaper);
        },

        /**
         * 更新一个已存在的试题
         * @param updatedPaper - 包含更新后数据的试题对象 (必须包含 id)
         */
        updatePaper(updatedPaper: sysTesPaper) {
            if (!updatedPaper.id) {
                console.error('Cannot update paper without an ID.');
                return;
            }
            const index = this.sysTesPaper.findIndex((paper) => paper.id === updatedPaper.id);
            if (index !== -1) {
                // 使用展开运算符创建新对象，确保 Vue 的响应式系统能够检测到变化
                this.sysTesPaper[index] = { ...this.sysTesPaper[index], ...updatedPaper };
            } else {
                console.warn(`试题 with ID ${updatedPaper.id} not found for update.`);
            }
        },

        /**
         * 根据ID删除一个试题
         * @param id - 要删除的试题ID (类型已修改)
         */
        deletePaper(id: string) { // 参数类型已修改
            // 使用 filter 方法创建一个不包含该ID的新数组，并重新赋值给 state
            // 这是一种更安全、更函数式的删除方式
            this.sysTesPaper = this.sysTesPaper.filter((paper) => paper.id !== id);
        },

        /**
         * 批量设置试题列表，通常用于从后端API加载数据
         * @param papers - 从后端获取的试题数组
         */
        setPapers(papers: sysTesPaper[]) {
            this.sysTesPaper = papers;
        },

        /**
         * 清空所有试题数据
         */
        clearPapers() {
            this.sysTesPaper = [];
        },
    },

    // 6. 持久化配置 (如果使用了 pinia-plugin-persistedstate)
    persist: true,
});
